package com.smart.community.region.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.smart.community.region.entity.ShopRentRecord;
import com.smart.community.region.vo.ShopRentRecordVO;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.List;

/**
 * 店铺租金记录Mapper接口
 * 
 * @author Wu.Liang
 * @version 1.0.0
 * @since 2025-09-30
 */
public interface ShopRentRecordMapper extends BaseMapper<ShopRentRecord> {
    
    /**
     * 分页查询租金记录（无权限限制）
     * 
     * @param page 分页参数
     * @param shopId 店铺ID
     * @param ownerId 店铺业主ID
     * @param paymentStatus 支付状态
     * @param rentPeriod 租金期间
     * @param rentMonth 租金月份
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 分页结果
     */
    IPage<ShopRentRecordVO> selectRentRecordPageWithoutPermission(Page<ShopRentRecordVO> page,
                                                                   @Param("shopId") Long shopId,
                                                                   @Param("ownerId") Long ownerId,
                                                                   @Param("paymentStatus") Integer paymentStatus,
                                                                   @Param("rentPeriod") String rentPeriod,
                                                                   @Param("rentMonth") String rentMonth,
                                                                   @Param("startDate") LocalDate startDate,
                                                                   @Param("endDate") LocalDate endDate);
    
    /**
     * 分页查询租金记录（带社区权限限制）
     * 
     * @param page 分页参数
     * @param shopId 店铺ID
     * @param ownerId 店铺业主ID
     * @param paymentStatus 支付状态
     * @param rentPeriod 租金期间
     * @param rentMonth 租金月份
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @param communityIds 用户可访问的社区ID列表
     * @return 分页结果
     */
    IPage<ShopRentRecordVO> selectRentRecordPageWithPermission(Page<ShopRentRecordVO> page,
                                                               @Param("shopId") Long shopId,
                                                               @Param("ownerId") Long ownerId,
                                                               @Param("paymentStatus") Integer paymentStatus,
                                                               @Param("rentPeriod") String rentPeriod,
                                                               @Param("rentMonth") String rentMonth,
                                                               @Param("startDate") LocalDate startDate,
                                                               @Param("endDate") LocalDate endDate,
                                                               @Param("communityIds") List<Long> communityIds);
    
    /**
     * 根据店铺ID查询租金记录列表
     * 
     * @param shopId 店铺ID
     * @return 租金记录列表
     */
    List<ShopRentRecord> selectRentRecordsByShopId(@Param("shopId") Long shopId);
    
    /**
     * 根据业主ID查询租金记录列表
     * 
     * @param ownerId 业主ID
     * @return 租金记录列表
     */
    List<ShopRentRecord> selectRentRecordsByOwnerId(@Param("ownerId") Long ownerId);
    
    /**
     * 根据支付状态查询租金记录列表
     * 
     * @param paymentStatus 支付状态
     * @return 租金记录列表
     */
    List<ShopRentRecord> selectRentRecordsByPaymentStatus(@Param("paymentStatus") Integer paymentStatus);
    
    /**
     * 根据租金期间查询租金记录列表
     * 
     * @param rentPeriod 租金期间
     * @return 租金记录列表
     */
    List<ShopRentRecord> selectRentRecordsByPeriod(@Param("rentPeriod") String rentPeriod);
    
    /**
     * 根据日期范围查询租金记录列表
     * 
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 租金记录列表
     */
    List<ShopRentRecord> selectRentRecordsByDateRange(@Param("startDate") LocalDate startDate,
                                                       @Param("endDate") LocalDate endDate);
    
    /**
     * 统计租金记录数量
     * 
     * @param shopId 店铺ID
     * @param paymentStatus 支付状态
     * @return 租金记录数量
     */
    Integer countRentRecords(@Param("shopId") Long shopId, 
                            @Param("paymentStatus") Integer paymentStatus);
    
    /**
     * 统计租金总金额
     * 
     * @param shopId 店铺ID
     * @param paymentStatus 支付状态
     * @return 租金总金额
     */
    BigDecimal sumRentAmount(@Param("shopId") Long shopId, 
                             @Param("paymentStatus") Integer paymentStatus);
    
    /**
     * 根据ID查询租金记录详情（包含店铺信息）
     * 
     * @param id 租金记录ID
     * @return 租金记录详情
     */
    ShopRentRecordVO selectRentRecordDetailById(@Param("id") Long id);
    
    /**
     * 获取租金统计信息
     * 
     * @param shopId 店铺ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 租金统计信息
     */
    Object selectRentStatistics(@Param("shopId") Long shopId,
                                             @Param("startDate") LocalDate startDate,
                                             @Param("endDate") LocalDate endDate);
}
